// redis.controller.ts
import { Controller, Get, Post, Delete, Param, Body, HttpCode, HttpStatus } from "@nestjs/common";
import { RedisService } from "./redis.services";

/**
 * Redis 控制器
 *
 * 提供 Redis 操作的 RESTful API 接口，包括设置、获取和删除键值对。
 *
 * @example
 * ```typescript
 * // GET /redis/test - 获取键值
 * // POST /redis/test - 设置键值
 * // DELETE /redis/test - 删除键值
 * ```
 */
@Controller("redis")
export class RedisController {
  /**
   * 构造函数
   *
   * @param redisService - Redis 服务实例
   */
  constructor(private readonly redisService: RedisService) {}

  /**
   * 获取 Redis 键值
   *
   * 通过键名获取存储在 Redis 中的值
   *
   * @param key - 要获取的键名
   * @returns 返回包含键名、值和存在状态的响应对象
   *
   * @example
   * ```bash
   * GET /redis/test
   * ```
   */
  @Get(":key")
  async get(@Param("key") key: string) {
    const value = await this.redisService.get(key);
    return {
      key,
      value,
      exists: value !== null && value !== undefined,
    };
  }

  /**
   * 设置 Redis 键值
   *
   * 将键值对存储到 Redis 中。如果键已存在，则覆盖原有值。
   *
   * @param key - 要设置的键名
   * @param body - 请求体，包含 value（值）和可选的 ttl（过期时间，秒）
   * @returns 返回操作结果
   *
   * @example
   * ```bash
   * POST /redis/test
   * Content-Type: application/json
   *
   * {
   *   "value": "test value",
   *   "ttl": 3600
   * }
   * ```
   */
  @Post(":key")
  @HttpCode(HttpStatus.OK)
  async set(@Param("key") key: string, @Body() body: { value: string; ttl?: number }) {
    const { value, ttl } = body;
    console.log(`set: ${key}, ${value}, ${ttl}`);
    if (ttl && ttl > 0) {
      await this.redisService.setWithTTL(key, value, ttl);
    } else {
      await this.redisService.set(key, value);
    }

    return {
      key,
      value,
      ttl: ttl || null,
      message: "设置成功",
    };
  }

  /**
   * 删除 Redis 键
   *
   * 从 Redis 中删除指定的键
   *
   * @param key - 要删除的键名
   * @returns 返回删除操作的结果
   *
   * @example
   * ```bash
   * DELETE /redis/test
   * ```
   */
  @Delete(":key")
  @HttpCode(HttpStatus.OK)
  async del(@Param("key") key: string) {
    const deleted = await this.redisService.del(key);
    return {
      key,
      deleted: deleted > 0,
      message: deleted > 0 ? "删除成功" : "键不存在",
    };
  }
}
